package com.example.container.DiscardPolicy;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * DiscardPolicy --- 当任务添加到线程池中被拒绝时，线程池将丢弃被拒绝的任务。
 * Created by ZMJ on 2019/12/29.

 运行结果:
  task-0 is running
  task-1 is running
 结果说明：
 线程池pool的"最大池大小"和"核心池大小"都为1(THREADS_SIZE)，这意味着"线程池能同时运行的任务数量最大只能是1"。
 线程池pool的阻塞队列是ArrayBlockingQueue，ArrayBlockingQueue是一个有界的阻塞队列，ArrayBlockingQueue的容量为1。这也意味着线程池的阻塞队列只能有一个线程池阻塞等待。

 根据""中分析的execute()代码可知：
 线程池中共运行了2个任务。
 第1个任务直接放到Worker中，通过线程去执行；
 第2个任务放到阻塞队列中等待。
 其他的任务都被丢弃了！

 */
public class DiscardPolicyTest {

    private static final int THREAD_SIZE = 1;
    private static final int CAPACITY = 1;

    public static void main(String[] args) {
        // 创建线程池。线程池的"最大池大小"和"核心池大小"都为1(THREADS_SIZE)，
        //"线程池"的阻塞队列容量为1(CAPACITY)。
        //"线程池"的拒绝策略为丢弃
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
                THREAD_SIZE,
                THREAD_SIZE,
                0,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(CAPACITY),
                new ThreadPoolExecutor.DiscardPolicy()
        );


        //新建10个任务，添加到线程池中
        for(int i = 0; i < 10; i++){
            Runnable murun = new MyRunnable("task-" + i);
            poolExecutor.execute(murun);
        }

        // 关闭线程池
        poolExecutor.shutdown();
    }


}

class MyRunnable implements Runnable{

    private String name;

    public  MyRunnable(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(this.name + " is running");
    }

}
